package com.desay.pangoo.itmt.repository.spec;

import java.util.Collection;

import org.springframework.util.ObjectUtils;

import com.desay.pangoo.itmt.repository.spec.ExpandCriterion.Operator;

/**
 * @Description： 条件表达式
 * 
 * @author shouyi.huang@desay-svautomotive.com on 2019年7月23日下午8:35:34
 * @Modified By： [] on [] for [修改说明]
 *
 */
public class Restrictions {

	private Restrictions() {
	}

	/**
	 * 等于
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression eq(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.EQ);
	}

	/**
	 * 不等于
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression ne(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.NE);
	}

	/**
	 * 模糊匹配
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression like(String fieldName, String value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.LIKE);
	}

	/**
	 * 大于
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression gt(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.GT);
	}

	/**
	 * 小于
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression lt(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.LT);
	}

	/**
	 * 大于等于
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression gte(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.GTE);
	}

	/**
	 * 小于等于
	 * 
	 * @param fieldName
	 * @param value
	 * @param ignoreNull
	 * @return
	 */
	public static SimpleExpression lte(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.LTE);
	}

	/**
	 * 并且
	 * 
	 * @param criterions
	 * @return
	 */
	public static LogicalExpression and(ExpandCriterion... criterions) {
		return new LogicalExpression(criterions, Operator.AND);
	}

	/**
	 * 或者
	 * 
	 * @param criterions
	 * @return
	 */
	public static LogicalExpression or(ExpandCriterion... criterions) {
		return new LogicalExpression(criterions, Operator.OR);
	}

	/**
	 * 为空
	 * 
	 * @param criterions
	 * @return
	 */
	public static SimpleExpression isNull(String fieldName) {
		return new SimpleExpression(fieldName, null, Operator.ISNULL);
	}
	/**
	 * 分组聚合
	 * 
	 * @param criterions
	 * @return
	 */
	public static SimpleExpression groupBy(String fieldName) {
		return new SimpleExpression(fieldName, null, Operator.GROUPBY);
	}

	/**
	 * 不为空
	 * 
	 * @param criterions
	 * @return
	 */
	public static SimpleExpression isNotNull(String fieldName) {
		return new SimpleExpression(fieldName, null, Operator.ISNOTNULL);
	}

	/**
	 * 是否属于集合中的一个
	 * 
	 * @param criterions
	 * @return
	 */
	public static SimpleExpression isMember(String fieldName, Object value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		return new SimpleExpression(fieldName, value, Operator.ISMEMBER);
	}

	/**
	 * 集合不能为空
	 * 
	 * @param criterions
	 * @return
	 */
	public static SimpleExpression isNotEmpty(String fieldName) {
		return new SimpleExpression(fieldName, null, Operator.ISNOTEMPTY);
	}

	/**
	 * 集合为空
	 * 
	 * @param criterions
	 * @return
	 */
	public static SimpleExpression isEmpty(String fieldName) {
		return new SimpleExpression(fieldName, null, Operator.ISEMPTY);
	}

	/**
	 * 包含于
	 * 
	 * @param fieldName
	 * @param value
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	public static LogicalExpression in(String fieldName, Collection value, boolean ignoreNull) {
		if (ignoreNull && ObjectUtils.isEmpty(value)) {
			return null;
		}
		SimpleExpression[] ses = new SimpleExpression[value.size()];
		int i = 0;
		for (Object obj : value) {
			ses[i] = new SimpleExpression(fieldName, obj, Operator.EQ);
			i++;
		}
		return new LogicalExpression(ses, Operator.OR);
	}
}
